﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
using LASDesktop.Classes;
using LASDesktop.LASDBClasses;

namespace LASDesktop.ModuloBancos 
{
    
    /// <summary>
    /// Interaction logic for Window1.xaml
    /// </summary>
    public partial class Bancos 
    {
        private LASDBDataContext _db = new LASDBDataContext();
        private readonly int _companyId;
        private Login _parent;

        public Bancos(Login parent)
        {
            //TODO: Obtener compañia
            _companyId = 1;
            _parent = parent;
            InitializeComponent();
            LoadClientesCodes();
            LoadProveedoresCodes();

        }

        #region Socios

        public void SetOverlayVisibilityHidden()
        {
            Overlay.Visibility = Visibility.Hidden;
        }

        private List<GetPartnersResult> GetPartnersFromCompany(string tipo)
        {

            List<GetPartnersResult> listaDeSocios = null;

            try
            {
                listaDeSocios = _db.GetPartners(_companyId, tipo).ToList();

            }
            catch
            {
                //TODO: Error al recuperar los articulos
            }

            return listaDeSocios;
        }

        #endregion



        #region Métodos de actualización del GUI
        /// <summary>
        /// Método que carga la lista de los códigos de los socios existentes al combobox
        /// </summary>
        private void LoadClientesCodes()
        {
            try
            {
                var result = GetPartnersFromCompany(Constants.CLIENTE);
                InputClientes.ItemsSource = result;
                InputClientes.DisplayMemberPath = "CodigoSocios";
                InputClientes.SelectedIndex = 0;
            }
            catch
            {
                //TODO: Error
            }
        }

        /// <summary>
        /// Método que carga la lista de los documentos de un determinado socio al grid.
        /// </summary>
        private void LoadClientesDocuments()
        {
            try
            {
                //Actualiza el Datacontext en caso de cambios
                _db = new LASDBDataContext();


                var clienteId = (InputClientes.SelectedItem as GetPartnersResult).IdSocio;
                var documentsList = GetPartnerDocuments(clienteId);
                DocumentosClientesGrid.ItemsSource = documentsList;
            }
            catch
            {
                
            }
        }

        private void ClienteComboChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
        {
            var clientName = (InputClientes.SelectedItem as GetPartnersResult).Nombre;
            TextNombreCliente.Content = clientName;
            LoadClientesDocuments();
        }

        /// <summary>
        /// Método que carga la lista de los códigos de los socios existentes al combobox
        /// </summary>
        private void LoadProveedoresCodes()
        {
            try
            {
                var result = GetPartnersFromCompany(Constants.PROVEEDOR);
                InputProveedores.ItemsSource = result;
                InputProveedores.DisplayMemberPath = "CodigoSocios";
                InputProveedores.SelectedIndex = 0;
            }
            catch
            {
                //TODO: Error
            }
        }

        /// <summary>
        /// Método que carga la lista de los documentos de un determinado socio al grid.
        /// </summary>
        private void LoadProveedoresDocuments()
        {
            try
            {
                //Actualiza el Datacontext en caso de cambios
                _db = new LASDBDataContext();


                var proveedorId = (InputProveedores.SelectedItem as GetPartnersResult).IdSocio;
                var documentsList = GetPartnerDocuments(proveedorId);
                DocumentosProveedoresGrid.ItemsSource = documentsList;
            }
            catch
            {

            }
        }

        private void ProveedorComboChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
        {
            var clientName = (InputProveedores.SelectedItem as GetPartnersResult).Nombre;
            TextNombreProveedor.Content = clientName;
            LoadProveedoresDocuments();
        }
        
        
        #endregion

        #region Métodos LINQ-TO-SQL

        public List<GetPartnerDocumentsResult> GetPartnerDocuments(int idSocio)
        {
            List<GetPartnerDocumentsResult> listaDocumentos = null;

            try
            {
                listaDocumentos = _db.GetPartnerDocuments(idSocio).ToList();

            }
            catch
            {
                //TODO: Error al recuperar los articulos
            }

            return listaDocumentos;
        }
        #endregion

        private void CancelarDocumentosClientes(object sender, RoutedEventArgs e)
        {
            var socio = (GetPartnersResult) InputClientes.SelectedItem;
            var documentos = DocumentosClientesGrid.SelectedItems.Cast<GetPartnerDocumentsResult>().ToList();
            if (documentos.Count == 0) return;
            var ventanaTransferencia = new VisorDeTransferencias(this, socio, documentos, _companyId, "Cliente");
            Overlay.Visibility = Visibility.Visible;
            ventanaTransferencia.ShowDialog();
        }


        private void CancelarDocumentosProveedores(object sender, RoutedEventArgs e)
        {
            var socio = (GetPartnersResult) InputProveedores.SelectedItem;
            var documentos = DocumentosProveedoresGrid.SelectedItems.Cast<GetPartnerDocumentsResult>().ToList();
            if (documentos.Count == 0) return;
            var ventanaTransferencia = new VisorDeTransferencias(this, socio, documentos, _companyId, "Proveedor");
            Overlay.Visibility = Visibility.Visible;
            ventanaTransferencia.ShowDialog();
        }

        #region Eventos de la ventana
        /// <summary>
        /// Método que se dispara al seleccionar una opción del menú general
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void ChangeWindow(object sender, System.Windows.Input.MouseButtonEventArgs e)
        {
            if (sender.GetType() != (typeof(Label))) return;

            switch (((Label)sender).Content.ToString())
            {
                case "Inventario":
                    _parent.MostrarInventarios();
                    break;
                case "Ventas":
                    _parent.MostrarVentas();
                    break;
                case "Socios":
                    _parent.MostrarSocios();
                    break;
                case "Bancos":
                    _parent.MostrarBancos();
                    break;
                case "Compras":
                    _parent.MostrarCompras();
                    break;
            }
        }

        /// <summary>
        /// Método que se dispara al cerrar la ventana.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void CloseParent(object sender, System.ComponentModel.CancelEventArgs e)
        {
            _parent.Close();
        }
        #endregion

    }
}
